using System;
using System.Collections.Generic;
using SqlSugar;
using ErrorCode;

namespace Domain
{
    /// <summary>
    /// 工作流实体类
    /// 表示一个完整的工作流实例，包含工作流的基本信息、状态、步骤集合和变量集合
    /// 工作流用于管理和追踪业务流程的执行，如审批流程、处理流程等
    /// </summary>
    [SugarTable("Workflow")]
    public class Workflow
    {
        /// <summary>
        /// 工作流唯一标识符
        /// 自增主键
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        
        /// <summary>
        /// 工作流名称
        /// 用于标识和描述工作流的用途，如"采购申请审批流程"、"请假审批流程"等
        /// </summary>
        [SugarColumn(ColumnName = "Name")]
        public string Name { get; set; }
        
        /// <summary>
        /// 工作流描述
        /// 提供关于工作流目的、适用范围和特殊说明的详细信息
        /// </summary>
        [SugarColumn(ColumnName = "Description")]
        public string Description { get; set; }
        
        /// <summary>
        /// 工作流当前状态
        /// 表示工作流的执行阶段：
        /// - Created: 已创建，初始状态
        /// - InProgress: 进行中，正在执行
        /// - Completed: 已完成，所有步骤都已执行完毕
        /// - Terminated: 已终止，由于某种原因被手动终止
        /// </summary>
        [SugarColumn(ColumnName = "Status")]
        public WorkflowStatus Status { get; set; }
        
        /// <summary>
        /// 工作流创建时间
        /// 记录工作流实例被创建的具体时间点
        /// </summary>
        [SugarColumn(ColumnName = "CreatedTime")]
        public DateTime CreatedTime { get; set; }
        
        /// <summary>
        /// 工作流完成时间
        /// 记录工作流实例完成的具体时间点
        /// 如果工作流尚未完成，则为null
        /// </summary>
        [SugarColumn(ColumnName = "CompletedTime")]
        public DateTime? CompletedTime { get; set; }
        
        /// <summary>
        /// 工作流创建者
        /// 记录创建此工作流实例的用户标识，通常是用户ID或用户名
        /// </summary>
        [SugarColumn(ColumnName = "CreatedBy")]
        public string CreatedBy { get; set; }
        
        /// <summary>
        /// 工作流步骤集合
        /// 包含工作流中所有的步骤实例，按照Order属性排序执行
        /// 使用JSON格式存储在数据库中
        /// </summary>
        [SugarColumn(ColumnName = "Steps", IsJson = true)]
        public List<WorkflowStep> Steps { get; set; }
        
        /// <summary>
        /// 工作流变量集合
        /// 存储工作流执行过程中的动态数据，如表单数据、计算结果等
        /// 这些变量可以在不同步骤之间共享和传递
        /// 使用JSON格式存储在数据库中，键值对形式
        /// </summary>
        [SugarColumn(ColumnName = "Variables", IsJson = true)]
        public Dictionary<string, string> Variables { get; set; }

        /// <summary>
        /// 工作流构造函数
        /// 初始化工作流的基本属性：
        /// 1. 创建空的步骤集合
        /// 2. 创建空的变量字典
        /// 3. 设置创建时间为当前时间
        /// 4. 设置初始状态为已创建（Created）
        /// </summary>
        public Workflow()
        {
            Steps = new List<WorkflowStep>();
            Variables = new Dictionary<string, string>();
            CreatedTime = DateTime.Now;
            Status = WorkflowStatus.Created;
        }
    }
}